(function(global, factory) {
    "use strict"

    if ( typeof module === "object" && typeof module.exports === "object" ) {
        // 此条件成立，说明当前运行代码的环境支持CommonJS规范（浏览器不支持/node端支持）
        module.exports = global.document ?
			factory( global, true ) :
			function( w ) {
				if ( !w.document ) {
					throw new Error( "jQuery requires a window with a document" );
				}
				return factory( w );
			};
    } else {
        // 浏览器端运行
        factory(global)
    }

})(typeof window !== 'undefined' ? window : this, function(window, noGlobal) {
    "use strict";
    var version = "3.5.1",
        jQuery = function( selector, context ) {

            // The jQuery object is actually just the init constructor 'enhanced'
            // Need init if jQuery is called (just allow error to be thrown if not included)
            return new jQuery.fn.init( selector, context );
        };

    /**
     * 在导入JQ（但并没有把自己的JQuery/$暴露给全局），首先会把现有全局中叫做$/JQuery的存储起来，
     * 防止自己后期设置的$/JQuery会替换全局现有的
     */
    var _jQuery = window.jQuery,
        _$ = window.$;

    /**
     * 基于noConflict转移JQ对$/JQuery的使用权
     * @param {*} deep 
     */
    jQuery.noConflict = function( deep ) {
        if ( window.$ === jQuery ) {
            window.$ = _$;
        }
    
        if ( deep && window.jQuery === jQuery ) {
            window.jQuery = _jQuery;
        }
    
        return jQuery;
    };

    
    if ( typeof noGlobal === "undefined" ) {
        window.jQuery = window.$ = jQuery;
    }
})

/**
 * typeof window !== 'undefined' ? window : this
 * 区分浏览器环境和NODE环境
 *  浏览器传递给global的是window
 * 如果是node传递给global的是 global/模块
 */

// typeof 存在暂时性死区，检测一个未被声明过的变量，不会报错，结果是undefined